iT邦幫忙

4

IT專題-虛擬帳號登入FTP

Joejo 2017-09-10 16:55:2916443 瀏覽
  • 分享至 

  • xImage
  •  

環境: CentOS 6.9 套件: vsftpd , pam


原因:

在linux系統上說道FTP伺服器,大家都會很直覺的聯想到vsftpd。

vsftpd的預設登入帳號密碼會與我們linux系統上的進行串接;

所以很多時候你要開幾個帳號,你就得在系統上開幾個帳號。

其實這樣是非常危險的,

你只要稍不注意很可能就會讓某些帳號變成系統的大漏洞。

所以我們這邊要使用虛擬帳號來當給FTP作為登入使用。


處理方式:

1.下載相關套件

#yum install -y vsftpd

#yum install -y pam* db4*

#yum install libdb-utils (db_load使用)


2.vsftpd設定檔調整

#vim /etc/vsftpd/vsftpd.conf

(下面為設定內容)

=!================================================

#log 設定

xferlog_enable=YES

xferlog_file=/var/log/xferlog

xferlog_std_format=YES

#pam驗證的檔案是哪一隻(/etc/pam.d/vsftpd.virtual)

pam_service_name=vsftpd.virtual

#禁止匿名登入

anonymous_enable=NO

nopriv_user=vsftpd

local_enable=YES

#使用者權限

dirlist_enable=YES

download_enable=YES

write_enable=YES

local_umask=022

virtual_use_local_privs=YES

#變更家目錄路徑的相關設定

chroot_list_enable=YES

chroot_local_user=YES

chroot_list_file=/etc/vsftpd/chroot_list

#預設禁止登入的系統帳號

userlist_enable=YES

userlist_deny=YES

userlist_file=/etc/vsftpd/user_list

#虛擬帳號登入時,是使用哪個帳號做串接(vsftpd)

guest_enable=YES

guest_username=vsftpd

#虛擬帳號登入&預設的家目錄位置

($USER 是指登入後的帳號)

user_sub_token=$USER

local_root=/home/vsftpd/$USER

user_config_dir=/etc/vsftpd/userconf

#FTP顯示檔案的擁有者

hide_ids=YES

#系統設定

listen=YES

dirmessage_enable=YES

tcp_wrappers=YES

max_clients=200

max_login_fails=5

=!================================================


  1. 建立虛擬帳號

這邊是先建立帳號的清單

#vim /etc/vsftpd/virtual_users

清單格式(一行帳號;一行密碼,有多組帳號就依序填下去)

=!==================================

範例:

#ftpuser001account #帳號

#tpuser001passwd #密碼

#ftpuser002account #帳號

#ftpuser002passwd #密碼

user001

passwd001

…..

=!==================================

利用剛剛建立的清單建立.db的驗證登入檔案。

(這邊比較麻煩的是,如果要新增帳號,這個流程都要重做)

相較之下如果可以直接用mysql驗證登入會簡單許多。

#db_load -T -t hash -f /etc/vsftpd/virtual_users /etc/vsftpd/virtual_users.db


4.創建每個虛擬帳號的家目錄路徑&權限

#mkdir /etc/vsftpd/userconf

這個資料夾中,每一個帳號都是一個獨立檔案。

權限&家目錄都會在這裡設定。

(家目錄位置必須是實體帳號可以連結過去的位置)

#vim /etc/vsftpd/userconf/user001

=!=範例為唯讀的帳號權限============

#家目錄路徑位置

local_root=/home/volume01

#是否可以寫入檔案

write_enable=NO

#是否可以匿名上傳檔案

anon_upload_enable=NO

=!=================================


  1. 鎖定家目錄

#touch /etc/vsftpd/chroot_list

一般來說我們會將使用者限制在我們給他的家目錄之下。

但是有時候會有些特殊帳號,要可以離開家目錄,

到他的上一層的路徑撈取一些檔案資料。

這時候我們就是chroot的時候。

一般來說我們會建立一個空檔。

當有特殊帳號要離開家目錄的需求時,

我們會在這個檔案裏面加入他的【帳號名稱】。

服務重啟後,他就可以自由地切換目錄路徑,

因為太自由對管理者來說是很危險的事,

所以當使用者使用完畢後,要即刻將帳號從chroot中移除。


6.設定登入驗證的選項

#cp -rf /etc/pam.d/vsftpd /etc/pam.d/vsftpd.virtual

原始檔我們保留不動。

#vim /etc/pam.d/vsftpd.virtua

在設定/etc/pam.d/vsftpd.virtua的時候,

千萬記住用不到的東西就直接註解調。

雖然這便設定應該是一個沒有對應到,會繼續往下找對應的登入方式。

但我當時真的是因為部分設定沒註解,

造成我虛擬帳號要登入時需多的異常問題。

#%PAM-1.0

auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/virtual_users

account required /lib64/security/pam_userdb.so db=/etc/vsftpd/virtual_users

這邊要特別說明,你建立好的.db檔案,

在pam裡面設定時不需要將.db帶入設定檔當中,

他會自己去相關路徑當中找尋對應的檔案。

這好像也是很多人在說,

當你的帳號設定檔產生完.db檔後,要將設定檔砍掉的原因。

因為當你有相同的檔名在同一個路徑下,不管後面是不是帶.db,

他好像都會去讀取,結果就會造成部分的錯誤。


7.創建實體帳號

#useradd vsftpd -G users -d /home/vsftpd -s /bin/false

這邊的實體帳號就是我們虛實串接的一個橋樑。

我們的虛擬帳號需要有一個實體帳號的串接才可以在系統中做存取的動作。

到這邊就差不多都設定完了。

可以重啟一下vsftpd看看有沒有甚麼問題。

#service vsftpd restart

試著用剛剛創建的虛擬帳號進行登入測試。


8.錯誤訊息查詢

如果登入發生錯誤,就要去檢查一下LOG檔,

這邊我們要查詢pam.d驗證部分,

登入失敗原因的時候要去看【/var/log/secure】

(基本上錯誤都不超過5行,當登入失敗時就馬上去看一下吧)

#tail –n 5 /var/log/secure

這邊會很清楚地跟你說相關的錯誤原因。

=!成功訊息==========================================

vsftpd[25807]: pam_userdb(vsftpd.virtual:auth): user 'user001' granted access

=!==================================================

=!失敗訊息==========================================

這邊明顯地說出你的帳號user001密碼驗證失敗,

失敗的原因就得去看pam.d那邊的設定是不是有誤,

才會無法正確的驗證密碼部分。

pam_succeed_if(vsftpd.virtual:auth): error retrieving information about user user001

pam_userdb(vsftpd.virtual:auth): user ' user001' granted access

pam_unix(vsftpd.virtual:auth): check pass; user unknown

=!=================================================

=!失敗訊息=========================================

這邊是說因為MD5的問題,造成我的密碼無法正確的驗證。

這個訊息是指在用mysql做帳號密碼驗證的時候才會出現的問題。

pam_succeed_if(vsftpd.virtual:auth): error retrieving information about user user001

pam_mysql - non-crypt()ish MD5 hash is not supported in this build.

pam_unix(vsftpd.virtual:auth): check pass; user unknown

=!===================================================

原本我也是要用mysql Service作為我帳密登入驗證。

但我的pam_mysql.so一直不支援md5,

重新在編譯的時候套用了openssl也是一樣的狀況,

暫時就先不考慮用mysql的方式做登入驗證。

所以就先改為現在的方式,之後會再研究看看。


9.備註

下面是如果要使用mysql做帳號登入驗證時會需要的套件。

(1)mysql

#yum install -y mysql mysql-server pam_mysql

(2)pam_mysql-0.7RC1.tar.gz (重點在md5加解密)

#wget http://prdownloads.sourceforge.net/pam-mysql/pam_mysql-0.7RC1.tar.gz

#./configure --with-openssl=/usr --with-mysql=/usr

#make && make install

#ls /usr/lib/security | grep pam_mysql.so (檢查一下lib是否存在了)

(3)再來就是自己設計資料庫 & 在pam.d當中做些許設定的修改。

因為這部分我個人測試是失敗的狀況,

所以可能就請大家google尋找一些相關文件進行後續設定了。


10.附帶一提

我當初是為了要將外接式硬碟掛載到LINUX主機上,

提供外部使用者做連線使用,才會做到這個專題。

#mount -t ntfs-3g /dev/sdb1 /home/volume01

透過系統掛載上來的外接式硬碟的權限是777

也就是不管誰都可以直接存取。

而掛載點也必須有點留心,

要放在你的實體帳號可以過去的路徑。

(例如我建的帳號vsftpd,家目錄/home/vsftpd,有權限連到/home路徑下)

如果放錯路徑,不管你的權限是不是777,

在你的實體帳號要連過去那個資料夾之前就已經先被阻擋了。

所以這也是我把外接式硬碟掛載在/home目錄下的原因。

上面的方法只是臨時掛載,要開機啟用時就掛載,

當然還是要寫到/etc/fstab當中。

#vim /etc/fstab

=!格式==============================================

/dev/sdb1 /home/volume01 ntfs-3g defaults 0 0

=!==================================================

修改完可以試著掛載看看。

#mount -a

發現掛載失敗,要馬上先把剛才的設定拿掉,檢查有甚麼問題。

如果不處理,你下次重開機就會發現因為硬碟掛載的問題,你開不了機。


11.參考網址

http://www.kuqin.com/article/50vpn/1321601.html

http://it001.pixnet.net/blog/post/328302817-IT%E5%B0%88%E9%A1%8C-%E8%99%9B%E6%93%AC%E5%B8%B3%E8%99%9F%E7%99%BB%E5%85%A5FTP

(本篇完)


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
混水摸魚
iT邦研究生 2 級 ‧ 2017-09-11 09:29:50

很讚的教學文,感謝你的分享

chommy iT邦新手 1 級 ‧ 2017-09-11 10:26:52 檢舉

很讚的教學文 +1

Joejo iT邦新手 5 級 ‧ 2017-09-11 13:45:15 檢舉

謝謝你們的回應。

我要留言

立即登入留言